package org.example.day04;

import java.util.*;

/**
 * @author zlxad
 * @version 1.0
 * @description: TODO
 * <pre class="prettyprint">模拟一套简化的序列化传输方式，请实现下面的数据编码与解码过程
 * 1、编码前数据格式为[位置,类型，值]，多个数据的时候用逗号分隔，位置仅支持数字，不考虑重复等场景；类型仅支持：Integer/String/Compose（Compose的数据类型表示该存储的数据也需要编码）。
 * 2、编码后数据参考图示，数据区的格式是：位置#类型#长度#数，类型存储需要编码，Integer-&gt;0;String-&gt;1;Compose-&gt;2 长度是指数据的字符长度；数据仅允许数字、大小写字母、空格。
 * <div>
 * <img alt="" height="109" src="https://uploadfiles.nowcoder.com/images/20200716/329232_1594891854278_7269932FDD7F8BA760B50D8A119A60C0" title="" width="403">
 * </div>
 * 3、输入的<span>编码字符长度不能超过1000，一个数据的格式错误，则解析剩下数据，其他错误输出ENCODE_ERROR。
 * 4、输入的解码字符不能超过1000，</span>数据区异常则跳过继续解析剩余数据区，其他异常输出DECODE_ERROR。</pre> <br>
 * @date 2024/3/11 15:22
 */
public class test080 {
    // 编码方法，将数据编码成指定格式
    public static String encode(List<Object[]> data) {
        StringBuilder encodedData = new StringBuilder();
        for (Object[] entry : data) {
            String position = entry[0].toString();
            String type = (String) entry[1];
            String value = entry[2].toString();
            // 检查数据长度是否超过限制
            if (encodedData.length() + position.length() + type.length() + value.length() + 3 > 1000) {
                return "ENCODE_ERROR";
            }
            // 拼接编码后的数据格式
            encodedData.append(position).append("#").append(encodeType(type)).append("#").append(value.length()).append("#").append(value).append(",");
        }
        return encodedData.toString();
    }

    // 编码类型
    private static int encodeType(String type) {
        switch (type) {
            case "Integer":
                return 0;
            case "String":
                return 1;
            case "Compose":
                return 2;
            default:
                return -1; // 未知类型
        }
    }

    // 解码方法，将编码后的数据解析成原始数据
    public static List<Object[]> decode(String encodedData) {
        List<Object[]> decodedData = new ArrayList<>();
        String[] entries = encodedData.split(",");
        for (String entry : entries) {
            String[] parts = entry.split("#");
            // 检查数据区格式是否正确
            if (parts.length != 4) {
                return decodedData;
            }
            String position = parts[0];
            String type = decodeType(Integer.parseInt(parts[1]));
            int length = Integer.parseInt(parts[2]);
            String value = parts[3];
            // 检查数据长度是否超过限制
            if (position.length() + type.length() + length + value.length() + 3 > 1000) {
                return decodedData;
            }
            decodedData.add(new Object[]{position, type, value});
        }
        return decodedData;
    }

    // 解码类型
    private static String decodeType(int encodedType) {
        switch (encodedType) {
            case 0:
                return "Integer";
            case 1:
                return "String";
            case 2:
                return "Compose";
            default:
                return "Unknown";
        }
    }

    public static void main(String[] args) {
        // 示例数据
        List<Object[]> data = new ArrayList<>();
        data.add(new Object[]{"1", "Integer", "123"});
        data.add(new Object[]{"2", "String", "Hello"});
        data.add(new Object[]{"3", "Compose", "456"});
        data.add(new Object[]{"4", "UnknownType", "789"}); // 错误数据

        // 编码数据
        String encodedData = encode(data);
        System.out.println("Encoded data: " + encodedData);

        // 解码数据
        List<Object[]> decodedData = decode(encodedData);
        System.out.println("Decoded data:");
        for (Object[] entry : decodedData) {
            System.out.println(entry[0] + " " + entry[1] + " " + entry[2]);
        }
    }
}